/**
 * 请求模块
 */
import axios from 'axios'
import store from '@/store'
// import JSONBig from 'json-bigint'
import router from '@/router'

const request = axios.create({
  // 接口的基准路径
  // baseURL: 'http://ttapi.research.itcast.cn/',
  // baseURL: 'http://toutiao.itheima.net/',
  // baseURL: 'http://localhost:8000',
  // baseURL: 'http://192.168.14.34:8000',
  // baseURL: 'http://192.168.21.44:8000',
  baseURL: 'http://geek.itheima.net/'
  // 自定义后端返回的原始数据
  // data: 后端返回的原始数据，说白了就是 JSON 格式的字符串
  // transformResponse: [
  //   function(data) {
  //     try {
  //       return JSONBig.parse(data)
  //     } catch (err) {
  //       return data
  //     }

  //     // axios 默认会在内部这样来处理后端返回的数据
  //     // return JSON.parse(data)
  //   }
  // ]
})

// 请求拦截器是axios提供给我们使用的一个工具函数，它的最常见的使用场景就是为每一个请求添加用户令牌
// 请求拦截器的本质就是一个函数，它会在每一次请求发送之前执行。
// 请求拦截器是有固定写法的，我们必须按照axios的要求写代码，才能设置请求拦截器
request.interceptors.request.use(function (config) {
  if (store.state.user && store.state.user.token) {
    config.headers.Authorization = `Bearer ${store.state.user.token}`
  }

  console.log(config)
  // config形参必须return，不return会导致请求无法发送
  return config
})
// use方法的第一个参数是请求之前会执行的一个函数，use方法的第二个参数请求有出现异常的时候会执行的函数
// error => {
//   return Promise.reject(error)
// })

request.interceptors.response.use()

// 请求拦截器
// Add a request interceptor
// request.interceptors.request.use(
//   function(config) {
//     // 请求发起会经过这里
//     // config：本次请求的请求配置对象
//     // this.$store.state
//     const { user } = store.state
//     if (user && user.token) {
//       config.headers.Authorization = `Bearer ${user.token}`
//     }

//     // 注意：这里务必要返回 config 配置对象，否则请求就停在这里出不去了
//     return config
//   },
//   function(error) {
//     // 如果请求出错了（还没有发出去）会进入这里
//     return Promise.reject(error)
//   }
// )

// 响应拦截器
request.interceptors.response.use(
  // 第一个函数就是正常响应的时候要调用的函数
  function (response) {
    return response
  },
  // 第二个函数时候响应出错的时候会执行的函数
  async function (error) {
    // // 函数的形参error就是 响应时报的错误
    // // 下面的if判断就是判断 错误的状态码是不是 401，如果是401代表就是token过期了
    if (error.response && error.response.status === 401) {
      // 获取到Vuex中保存的user用户数据，在user用户数据中包含了过期的token，和refresh_token
      const user = store.state.user
      // 如果user不存在，或者user里面没有refresh_token
      if (!user || !user.refresh_token) {
        // 跳转到登录页面
        router.push('/login')
        return false
      }
      // 执行try...catch
      try {
        // 当我们请求刷新用户token的接口之后，接口返回的数据中就包含了 最新的token
        const res = await axios({
          method: 'PUT',
          url: 'http://geek.itheima.net/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${user.refresh_token}`
          }
        })
        console.log(res)
        // return
        // 将最新的token和refresh_token保存到Vuex中，
        store.commit('setUser', {
          token: res.data.data.token,
          refresh_token: user.refresh_token
        })
        // request( {url: method: }  )
        // error.config就是之前发生错误的那次请求的配置对象
        // 按照之前错误的那次请求的配置，重新请求一次
        return request(error.config)
      } catch (error) {
        router.push('/login')
      }
    } else {
      return Promise.reject(error)
    }
    // return Promise.reject(error)
  }
)

// // getRefreshToken函数的作用就是根据 refresh_token 来获取最新的token，用来替代之前过期的token
// export const getRefreshToken = async (fn) => {
//   // console.log(123)
//   // token已经过期了
//   // 使用refresh_token 刷新获取一个最新的token
//   const newAxios = axios.create({
//     // 接口的基准路径
//     // baseURL: 'http://ttapi.research.itcast.cn/',
//     baseURL: 'http://toutiao-app.itheima.net/',
//   })
//   // 获取Vuex中保存的用户信息，用户信息里面包含了token和refresh_token
//   const { user } = store.state

//   const data = await newAxios({
//     method: 'PUT',
//     url: '/v1_0/authorizations',
//     headers: {
//       Authorization: 'Bearer ' + user.refresh_token
//     }
//   })

//   // data结果中就会包含最新的token，然后我们就可以将token保存到Vuex当中，
//   console.log(data)
//   // 将获取到的最新的token保存到vuex中
//   user.token = data.data.data.token
//   store.commit('setUser', user)

//   fn && fn()
// }

export default request
